#include "ESP32_freertos.h"

// 创建 FreeRTOS 任务
void TASK_CREATE(void)
{
    // 创建 LED 任务，堆栈大小为 2048，优先级为 3
    // xTaskCreate(LED_TASK, "LED任务创建", 2048, NULL, 3, NULL);
    // 创建 ADC 任务，堆栈大小为 2048，优先级为 3
    xTaskCreate(ADC_TASK, "ADC任务创建", 2048, NULL, 3, NULL);
    // 创建 LVGL 任务，堆栈大小为 8192，优先级为 3
    xTaskCreate(LVGL_TASK, "LVGL任务创建", 8192, NULL, 3, NULL);
    // 创建 WATCHDOG_TASK 任务，堆栈大小为 2048，优先级为 3
    xTaskCreate(WATCHDOG_TASK, "WATCHDOG_TASK任务创建", 2048, NULL, 3, NULL);

    // 将当前任务（主任务）添加到看门狗监控列表中
    esp_task_wdt_add(xTaskGetCurrentTaskHandle());
}

// 任务初始化
void TASK_Init(void)
{
    // 配置看门狗定时器
    esp_task_wdt_config_t wdt_config = {
        .timeout_ms = 10000, // 超时时间为 10 秒
        .trigger_panic = true // 启用恐慌处理
    };

    // 初始化看门狗定时器
    esp_task_wdt_init(&wdt_config);

    // 调用任务创建函数
    TASK_CREATE();
}

// 看门狗喂狗任务，周期性地重置看门狗计时器
void WATCHDOG_TASK(void *param)
{
    esp_task_wdt_add(NULL);
    while (1)
    {
        // 手动重置看门狗
        esp_task_wdt_reset();

        // 延时，根据需要调整，这里设置为1秒
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

// LVGL 任务
void LVGL_TASK(void *param)
{
    // 打开 LCD 背光
    st7789_lcd_backlight(true);

    // 将当前任务添加到看门狗监控列表中
    esp_task_wdt_add(NULL);

    while (1)
    {
        // 打印 LVGL 运行日志
        // ESP_LOGI("LVGL", "LVGL运行");


        
        // 调用 LVGL 任务处理函数
        lv_task_handler();

        // 手动重置看门狗
        esp_task_wdt_reset();

        // 延时 10 毫秒
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

// 读取 ADC 值的任务
void ADC_TASK(void *param)
{
    // 将当前任务添加到看门狗监控列表中
    // esp_task_wdt_add(NULL);

    // int adc_value = 0;

    while (1)
    {
        // if (unit_handle == NULL) {
        //     ESP_LOGE("ADC", "ADC unit handle is NULL");
        //     vTaskDelay(pdMS_TO_TICKS(1000));
        //     continue;
        // }

        // esp_err_t err = adc_oneshot_read(unit_handle, ADC_CHANNEL_4, &adc_value);
        // if (err == ESP_OK) {
        //     ESP_LOGI("ADC", "ADC1 channel %d (GPIO %d) value: %d", ADC_CHANNEL_4, GPIO_NUM_32, adc_value);
        // } else {
        //     ESP_LOGE("ADC", "Failed to read ADC value: %s", esp_err_to_name(err));
        // }

        // 手动重置看门狗
        // esp_task_wdt_reset();

        // 延时 1 秒
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}


// LED 灯任务
// void LED_TASK(void *param)
// {
//     // 将当前任务添加到看门狗监控列表中
//     esp_task_wdt_add(NULL);

//     while (1)
//     {
//         // 手动重置看门狗
//         esp_task_wdt_reset();

//         // 打印 LED 任务点灯日志
//         ESP_LOGI("LED_TASK", "LED任务点灯");
//         gpio_set_level(LED_PIN, GPIO_SET);
//         vTaskDelay(pdMS_TO_TICKS(1000));
//         ESP_LOGI("LED_TASK", "LED任务关灯");
//         gpio_set_level(LED_PIN, GPIO_RESET);
//         vTaskDelay(pdMS_TO_TICKS(1000));

//     }
// }
